/*
计算变量值
*/
#Requires AutoHotkey v2.0

; 仅在测试时包含
; #Include chinese\ChNum.ahk


class CalcVar{

    static first := true ; 第一次
    static val := "" ; 值
    static autoZeroPadding := false ; 自动补零
    static strLenth := 0

    ; 计算变量值
    static calc(str){
        
        ; 第一次执行(为了规避自动类型转换,我们在字符前面一个符号#,计算字符串长度时忽略它)
        if(this.first){
            if(SubStr(str, 1, 1) == "#"){
                this.strLenth := strLen(str) - 1
            } else{
                this.strLenth := strLen(str)
            }
            this.autoZeroPadding := this._IszeroPadding(str) ; 是否需要补0
        }

        ; 去除多余字符
        str := Trim(str,"# ")
    
        ; 纯数字
        if(this._IsNum(str)){
            return this._C_Num(str)
        }
    
        ; 中文数字
        if(this._IsChNum(str)){
            return this._C_ChNum(str)
        }
    
        return "#计算失败#"
    }
    
    ; 判断字符串是否为纯数字
    static _IsNum(str){
    
        nums := ["1","2","3","4","5","6","7","8","9","0"]
        
        ; 如果字符串中含有其他字符，返回false
        if(!this._OnlyIn(str,nums)){
            return false
        }

        return true
    }

    ; 判断字符串是否为中文数字
    static _IsChNum(str){
   
        nums := ["一","二","三","四","五","六","七","八","九","十","零"]
        
        ; 如果字符串中含有其他字符，返回false
        if(!this._OnlyIn(str,nums)){
            return false
        }

        return true
     }
    
    ; 判断字符串开头是否是'0'
    static _IszeroPadding(str) {
        
        ; 去除多余字符
        str := Trim(str,"# ")

        if (StrLen(str) == 1 && str == "0")
            return false
        return SubStr(str, 1, 1) == "0"
    }

    ; 重新计数
    static reset(){
        this.first := true
        this.autoZeroPadding := false
    }
    
    ; 处理纯数字
    static _C_Num(str){
        
        static num := 0
        if(this.first){
            this.first := false ; 执行了一次了
            num := Number(str) ; 赋初值

            if(this.autoZeroPadding){
                return this._zeroPadding(num,this.strLenth)
            }
            return num
        }
    
        num := num + 1
    
        if(this.autoZeroPadding){
            return this._zeroPadding(num,this.strLenth)
        }
        return num
    }
    
    ; 处理中文数字
    static _C_ChNum(str){
        static num := 0
        if(this.first){
            this.first := false ; 执行了一次了
            temp := ChineseToNum(str) ; 中文数字转换为纯数字
            num := Number(temp) ; 赋初值
            return NumToChinese(Number(num)) ; 纯数字转换为中文数字
        }
    
        num := num + 1
    
        return NumToChinese(Number(num)) ; 纯数字转换为中文数字
    }
    
    ; 补0 digital 数位
    static _zeroPadding(num,digital){

        strTemp := "" num ; 数字转字符串
        n := digital - StrLen(strTemp) ; 补几个0

        if(n <= 0){
            return strTemp
        }

        loop n { ; 补0
            strTemp := "0" strTemp
        }

        return strTemp
    }

    ; 文本text中是否只包含字符数组chars[]中的字符
    static _OnlyIn(text,chars){

        pass := false
    
        ; 判断chars 是不是对象
        if(!IsObject(chars)){
            return false
        }
        
        ; 判断chars 是不是数组
        if(!chars.__Class == "Array"){
            return false
        }
    
        loop parse text{
            c := A_LoopField
            loop chars.Length{
                if(c == chars[A_Index]){
                    pass := true
                    break
                }
            }
    
            if(!pass){
                return false
            }
    
            pass := false
        }
    
        return true
    
    }


}
